#ifndef SERIAL_PORT_H
#define SERIAL_PORT_H

#include <boost/asio.hpp>
#include <thread>
#include <mutex>
#include <functional>
#include <vector>
#include <string>
using namespace boost::asio;
// 串口通信类，带接收线程和回调函数
class SerialPort {
public:
    // 定义回调函数类型：接收数据后触发，参数为接收到的字节数组
    using ReceiveCallback = std::function<void(const std::vector<uint8_t>& data)>;

    // 构造函数
    SerialPort();
    
    // 析构函数
    ~SerialPort();

    // 打开串口：只需指定串口号和波特率，其他参数使用默认值
    bool open(const std::string& port_name, unsigned int baud_rate);
    
    // 关闭串口
    void close();
    
    // 检查串口是否打开
    bool is_open() const;
    
    // 发送数据（字符串）
    bool send(const std::string& data);
    
    // 发送数据（字节数组）
    bool send(const std::vector<uint8_t>& data);
    
    // 设置接收回调函数
    void set_receive_callback(ReceiveCallback callback);
    
    // 获取最后一次错误信息
    std::string get_last_error() const;

private:
    // 接收线程函数
    void receive_thread();
    
    // 异步接收处理函数
    void async_receive_handler(const boost::system::error_code& error, std::size_t bytes_transferred);

    boost::asio::io_service io_service_;          // Boost ASIO服务
    boost::asio::serial_port serial_port_;        // 串口对象
    std::thread receive_thread_;                  // 接收线程
    mutable std::mutex mutex_;                    // 互斥锁
    std::string last_error_;                      // 最后一次错误信息
    bool is_running_;                             // 线程运行标志
    ReceiveCallback receive_callback_;            // 接收回调函数
    std::vector<uint8_t> receive_buffer_;         // 接收缓冲区
};

#endif // SERIAL_PORT_H

